﻿package zf.media.audio.spectrum
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.geom.ColorTransform;
	import zf.media.audio.SoundProcessor;
	
	/**
	 * 利用当前声音频谱值生成频谱图像(基类) 
	 * @author mike.zhang
	 * @langversion 3.0 
	 * @playerversion Flash 9 
	 */
	public class SoundSpectrum extends Sprite
	{			
		//protected var sh:Sprite;
		//private var sp:SoundProcessor;

		/**
		 * @private 
		 */
		protected var _f:Boolean=false;
		/**
		 * @private 
		 */
		protected var _abs:Boolean=false;
		//protected var _m:Boolean=false;
		/**
		 * 绘图的混合模式 
		 */
		protected var _blendMode:String;
		/**
		 * 频谱值数组 
		 */
		protected var byArr:Array;
		/**
		 * 将频谱数据分的份数 
		 */
		protected var ff:uint=16;
		/**
		 * 宽度
		 */
		protected var ww:Number;
		/**
		 * 高度
		 */
		protected var hh:Number;

		/**
		 * @private
		 * 背景图，用于切换频谱类型时候背景的过渡 
		 */
		protected var _bg:Bitmap;
		
		/**
		 * @private
		 * 一个非黑色系的颜色 
		 */
		protected var randomCt:ColorTransform;
		
		/**
		 * 类型 
		 */
		public var type:String;
		
		/**
		 * 创建声音频谱图形 
		 * @param w 宽度
		 * @param h 高度
		 * 
		 */
		public function SoundSpectrum (w:Number=60,h:Number=40):void
		{
			type="SoundSpectrum";
			ww=w;
			hh=h;
			_blendMode=null;
			_bg=null;
			randomCt=getCt();
			//_bg=bg;
			/*var bg:Sprite=new Sprite;
			bg.graphics.beginFill (0xFFFFFF);
			bg.graphics.drawRect (0,0,ww,hh);
			bg.graphics.endFill ();
			addChild(bg);*/
			//sp=new SoundProcessor  ;
			
			addEventListener (Event.ENTER_FRAME,enterFrameEvent);
			addEventListener (Event.ADDED,init);
			addEventListener (Event.REMOVED,onRemoved);
		}
		/**
		 * 初始化。将在  Event.ADDED 时候自动执行
		 * @param e Event.ADDED事件将触发该函数执行
		 * 
		 */
		protected function init (e:Event=null):void
		{
			if (_bg == null)
			{
				_bg=new Bitmap(new BitmapData(width,height,true,0xFF000000));
			}
			addChild (_bg);
		}
		/**
		 * 删除。 将在  Event.REMOVED 时候自动执行
		 * @param e Event.REMOVED事件将触发该函数执行
		 * 
		 */
		protected function onRemoved(e:Event):void
		{
			removeEventListener(Event.ENTER_FRAME,enterFrameEvent);
			removeEventListener (Event.ADDED,init);
			removeEventListener (Event.REMOVED,onRemoved);
		}
		/**
		 * 绘图模式，是否采用混合模式 
		 * @return 
		 * 
		 */
		public function get bMode ():String
		{
			return _blendMode;
		}
		public function set bMode (s:String):void
		{
			_blendMode=s;
		}
		/**
		 * 背景图 
		 * @return 
		 * 
		 */
		public function get background ():Bitmap
		{
			return _bg;
		}
		public function set background (bg:Bitmap):void
		{
			if (_bg)
			{
				removeChild (_bg);
			}
			_bg=bg;
			addChild (_bg);
		}
		/**
		 * 一个用于指示是否首先对声音数据执行 Fourier 转换的布尔值。 将此参数设置为 true 会导致方法返回的是频谱而不是原始声音波形。 在频谱中，左侧表示的是低频，右侧表示的是高频。 
		 * @return 
		 * 
		 */
		public function get FFTMode ():Boolean
		{
			return _f;
		}
		public function set FFTMode (b:Boolean):void
		{
			_f=b;
		}
		/**
		 * 是否对频谱数据取绝对值 
		 * @return 
		 * @see SoundProcessor.abs
		 */
		public function get abs ():Boolean
		{
			return SoundProcessor.abs;
		}
		public function set abs (bool:Boolean):void
		{
			SoundProcessor.abs=bool;
		}
		/**
		 * 是否对频谱数据加工 
		 * @return 
		 * @see SoundProcessor.machining
		 */
		public function get machining():Boolean
		{
			return SoundProcessor.machining;
		}
		public function set machining(b:Boolean):void
		{
			SoundProcessor.machining=b;
		}
		/**
		 * 设置图形大小 
		 * @param w 宽度
		 * @param h 高度
		 * 
		 */
		public function setSize (w:Number,h:Number):void
		{
			ww=w;
			hh=h;
		}
		private function enterFrameEvent (e:Event):void
		{
			e.stopPropagation ();
			draw ();
		}
		/**
		 * 绘制函数 
		 * 
		 */
		protected function draw ():void
		{
			byArr=SoundProcessor.getSoundSpectrum(_f,ff);
		}
		private function getOne():int
		{
			return Math.random()>0.5?1:-1;
		}
		private function random():Number
		{
			//return (int(Math.random()*10000)%100)*0.01;
			return Math.random();
		}
		/**
		 * 获取一组颜色，非黑色系 
		 * @return ColorTransform
		 * 
		 */
		protected function getCt():ColorTransform
		{
			var ct:ColorTransform=new ColorTransform();
			ct.alphaOffset=getOne()*(random()*255);
			ct.alphaMultiplier=random();
			ct.redOffset=getOne()*(random()*192+63);
			ct.redMultiplier=random();
			ct.greenOffset=getOne()*(random()*192+63);
			ct.greenMultiplier=random();
			ct.blueOffset=getOne()*(random()*192+63);
			ct.blueMultiplier=random();
			return ct;
		}
		/**
		 * 默认配置
		 */ 
		public function defaultConfig():void
		{
			abs=false;
			machining=false;
			
		}
	}
}